package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.common.R;
import com.itheima.common.ReggieConstants;
import com.itheima.pojo.Employee;
import com.itheima.service.EmployeeService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;

@RestController
@RequestMapping("employee")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    /**
     * 登录
     * @param request
     * @param employee
     * @return
     */
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){

        //①. 将页面提交的密码password进行md5加密处理, 得到加密后的字符串

        if(StringUtils.isBlank(employee.getPassword())){
            return R.error("密码为空，无法登录");
        }
        String md5Pwd = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
        //②. 根据页面提交的用户名username查询数据库中员工数据信息
        //select * from employee where username = ''
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Employee::getUsername,employee.getUsername());
        //如果这个sql查到多条数据，会抛异常
        Employee dbEmp = employeeService.getOne(lqw);
        //{"id":1,"name":"管理员"}......
        //③. 如果没有查询到, 则返回登录失败结果
        if(dbEmp==null){
            return R.error("用户不存在");
        }
        //④. 密码比对，如果不一致, 则返回登录失败结果
        //要拿加密后的密码来对比
        if(!md5Pwd.equals(dbEmp.getPassword())){
            //密码对比没成功
            return R.error("密码错误");
        }
        //⑤. 查看员工状态，如果为已禁用状态，则返回员工已禁用结果
        if(dbEmp.getStatus()==0){
            return R.error("用户已被禁用，无法登录");
        }
        //⑥. 登录成功，将员工id存入Session, 并返回登录成功结果
        request.getSession().setAttribute(ReggieConstants.EMP_SESSION_KEY,dbEmp.getId());
        return R.success(dbEmp);
    }


    /**
     * 无参数的退出方法
     * @return
     */
    @PostMapping("/logout")
    public R<String> logout(HttpServletRequest request){
        //要做什么事？
        request.getSession().removeAttribute(ReggieConstants.EMP_SESSION_KEY);
        return R.success("登出成功");
    }

    // 添加员工
    @PostMapping
    public R<String> save(HttpServletRequest request,@RequestBody Employee employee){
        //要存储记录
        //通过username先查一下
        //凭空出现的字符串、数字之类的，叫魔法值
        employee.setPassword(DigestUtils.md5DigestAsHex(ReggieConstants.DEFAULT_PWD.getBytes()));
        // employee.setCreateTime(LocalDateTime.now());
       // employee.setUpdateTime(LocalDateTime.now());
       // Long empId = (Long) request.getSession().getAttribute(ReggieConstants.EMP_SESSION_KEY);
        //创建人
        // 记录了谁创建的？
        //employee.setCreateUser(empId);
        //修改人
       // employee.setUpdateUser(empId);
        // this 调用自己的成员变量
        this.employeeService.save(employee);
        return R.success("新增员工成功");
    }

    // 分页查询
    @GetMapping("/page")
    public R<Page<Employee>>  pageEmployee (Integer page, Integer pageSize, String name ){

        Page<Employee> empPage = new Page<>(page,pageSize);
        // 查询
        // selete * from employee where name like '' limit ?,?
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        // 两个条件的

//        if (StringUtils.isNotBlank(name)){
//            lqw.like(Employee::getName,name );
//        }
        // null值判断  StringUtils.isNotBlank(name)  !null !" "
        // 三个条件的 因为name有可能是为空的
        lqw.like(StringUtils.isNotBlank(name),Employee::getName,name);

        // 排序 按创建时间 产品文档要求的
        lqw.orderByDesc(Employee::getCreateTime);


        employeeService.page(empPage,lqw);
        return R.success(empPage);
    }

    @PutMapping
    public R<String> updateEmployee(HttpServletRequest request ,@RequestBody Employee employee){

        // 用后端修改管理员禁用问题
//        if (employee.getId()== 1L && employee.getStatus()==0){
//
//        }
        // 其他字段都是空的 不会被改为空
         Long id = (Long) request.getSession().getAttribute(ReggieConstants.EMP_SESSION_KEY);
      //  employee.setUpdateUser(id);
      //  employee.setUpdateTime(LocalDateTime.now());
        employee.setUpdateTime(null);  // 防止时间不更新
        employee.setUpdateUser(null);
        employeeService.updateById(employee);
        return  R.success("修改成功");
    }

    @GetMapping("/{id}")
    public R<Employee> getEmployeeById(@PathVariable Long id){
        Employee employee = employeeService.getById(id);
        return  R.success(employee);
    }


}


